<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 将一个函数作为另外一个函数的参数来传递
        // 1、函数可以传递基本类型的参数
        function fn(a) {
            console.log(a);
        }
        fn(10);
        fn("hello");
        fn(true);
        // 2、函数传递引用类型
        // 现在arr变量在栈区记录的是堆区的地址
        let arr = [1, 2, 3];// let arr = 0X111
        // 调用函数 其本身是将arr栈区记录的数据内存地址传递给了形参
        fn(arr);//fn(0X111)
        // 3、将函数作为实参传递 
        // 等价于 let cb = 0X222
        let cb = function(){
            console.log('回调函数');
        }
        fn(cb);
        // 4、回调函数
        function fn2(cb){
            cb();
        }
        fn2(cb);
        // 5、匿名函数简写
        function fn3(cb){
            cb();
        }
        // fn3(0X444)
        fn3(function(){
            console.log('回调函数被执行了 fn3执行时候cb()才将这个匿名函数调用起来')
        })
        // 6、回调同时携带参数
        function fn4(cb){
            let name = "亚索";
            // 调用函数 传递的是实参
            cb(name);
        }


        fn4(function(a){
            console.log(a+'vs'+'盖伦');
        })
        // 回调的应用场景是在自己封装函数的时候 部分功能不确定 如果这个代码你写了就固定了 不写又缺少 考虑使用回调函数
        // 通过使用回调函数 将不确定的因素交给使用者来决定

    </script>
</body>

</html>